【新機能】AWS LambdaにSlack連携のBluePrintが登場。ChatOpsがより手軽に
こんにちは、せーのです。今日は普段Slackをお使いの皆様にオススメの新機能をご紹介します。今日ご紹介する機能を使うとSlackを使ってAWSを操作する、所謂「ChatOps」が手軽にできるようになります。
LambdaからSlackへ
LambdaのFunctionを選ぶとまず「BluePrint」と呼ばれるナビゲートが出てきます。これはその名の通りLambdaを使って何を書きたいのか、という青写真が書かれているのですが、今回のアップデートでこのBluePrintに「Slack」の連携が登場しました。
Slackとは2014年に正式リリースされたコミュニケーションツールです。数ある社内チャットツールの中でも使い勝手の良さで人気が高いソフトですのでご存じの方も多いかと思います。 今回用意されたBluePirntを使うことでSlackとAWSの連携がより簡単になり、チャットをトリガーに開発やクラウドを動かす「ChaoOps」が身近になりました。
内容
今回用意されたBluePrintは「Slack-echo-command」と「Cloudwatch-alarm-to-slack」の2つ。
「Slack-echo-command」はSlackの一定のコマンドに対してLambdaを反応させるものです。直接SlackがLambdaを叩くわけではなく、API Gatewayを通してLambdaが起動する、というアーキテクチャになります。
一方[Cloudwatch-alarm-to-slack]はCloudwatch AlarmからSNSをリクエストし、それをトリガーにしてLambdaを起動させる、というものです。またLambdaからSlackにPOSTする際のURLを暗号化するのにKMSも使用します。Node.jsもPythonもあるのでどちらの言語でも得意な方で使えます。
両者ともAWSのアーキテクチャや連携を知らないとなかなか難しいものですが、このBlueprintを使うことで簡単に実現できます。これは便利ですね。
やってみた
準備
それではやってみましょう。今回はSlack-echo-commandを試してみます。
まずは準備としてSlackのWebhookが必要です。https://[slack名].slack.com/services/new にアクセスしてサービス画面を表示します。
検索窓より[Slash Commands]と入力し、コマンド連携のサービスを選択します。
対象となるslackの横のInstallボタンを押下するとコマンド名を決める画面が出てきます。今回は[/sayhello]というコマンド名にします。
コマンド名が設定されると次に設定画面が表示されます。そのうちこの[token]が必要になるのでコピーしておきましょう。 この後Lambda FunctionとAPI Gatewayを作成後、作成したAPI Endpointをここで設定するので一旦このまま置いておきます。
Tokenの暗号化
上で作成したTokenをKMSを使って暗号化します。まずはIAMよりKMSのナビを押下して新たにマスターキーを作成します。
名前を決めて入力します。
マスターキーを作成します。
AWS CLIを使って先ほどのTokenをマスターキーで暗号化します。
Tsuyoshis-iMac:~ Tsuyoshi$ aws kms encrypt --key-id alias/lambdaSlackTest --plaintext "YK1Z3WNobOo4cOVmyzkXSU3o" CiBJPKtxFJx5If1W2oy3DNBGQnc6pxhSM3K4azrNwNgqbhKfAQEBAgB4STyrcRSceSH9VtqMtwzQRkJ3OqcYUjNyuGs6zcDYKm4AAAB2MHQGCSqGSIb3DQEHBqBnMGUCAQAwYAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAyxQSzf0XRq1jqcVvQCARCAM3z1CQifEverCzLTyEYlsT57frPooDKjwolImozTwAekkS+xt9DBabR6JwJHsGOXfwOO1g== arn:aws:kms:ap-northeast-1:887464593869:key/8018a39e-99f3-47d5-9f5e-c5bfa0742462
暗号化されたTokenとARNは後で使うのでコピーして取っておきましょう。
Lambda Function作成
次にLambda Functionを作成します。BluePrintで[slack]でフィルタリングするとSlack関係のBluePrintが表示されます。Slack-echo-commandを選択します。私はNode.jsを使いました。
Lambda Functionの作成画面を開くとコード内に[kmsEncyptedToken]という変数があるので、そこに先程作成した暗号化したTokenを入れます。
var AWS = require('aws-sdk'); var url = require('url'); var https = require('https'); var qs = require('querystring'); var token, kmsEncyptedToken; kmsEncyptedToken = "CiBJPKtxFJx5If1W2oy3DNBGQnc6pxhSM3K4azrNwNgqbhKfAQEBAgB4STyrcRSceSH9VtqMtwzQRkJ3OqcYUjNyuGs6zcDYKm4AAAB2MHQGCSqGSIb3DQEHBqBnMGUCAQAwYAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAyxQSzf0XRq1jqcVvQCARCAM3z1CQifEverCzLTyEYlsT57frPooDKjwolImozTwAekkS+xt9DBabR6JwJHsGOXfwOO1g=="; exports.handler = function (event, context) {
次にRoleを新規で作成します。ここで先程作成したKMSのARNでTokenを復号化するIAM Roleを作成します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": [ "<your KMS key ARN>" ] } ] }
これでLambda FunctionはOKです。
IAM Roleの追加
上の設定でLambda自体のコードは走るのですが、ログを吐き出す権限がありませんのでIAM Roleから上で作成したRoleを開き、Cloudwatch LogsへのアクセスとPut権限を新規Policyとして追加します。この作業はLambda Function、API Gatewayを作り終わってからでもOKです。
API Gatewayの作成
さて作業はLambdaに戻って、Nextボタンを押すとAPI Gatewayの設定画面が出てきます。Resource nameを任意に決め、methodを"POST"、securityを"Open"にしてそのまま次に進みます。今回は[/slack-echo-test]というリソース名にしました。
Lambda Functionを作り終わったらAPI Gatewayの画面に行き、先程作成した[/slack-echo-test]をクリックし、Integration Requestを選択します。
Requestのマッピングを行います。mapping templateより[application/x-www-form-urlencoded]と入力し、マッピング対象には{ "body": $input.json("$") }と入力します。これでLambdaにjson形式でコマンドが入ります。
マッピングが終わったらprodステージでDeployします。デプロイするとAPI Endpointが表示されるのでコピーしておきましょう。
Slack設定
さて、最後の設定です。最初に作成したSlashのコマンド画面に戻ります。URLに先程作成したAPI GatewayのAPI Endpoint + リソース名を入力して連携を作成します。
これで全ての準備が整いました。
テスト
それではテストしてみましょう。slackから[/sayhello]と打ってみます。成功していればslackbotがそれを伝えてくれます。
Lambdaのログを見てみます。ユーザー名やコマンド内容がロギングされていれば成功です。
まとめ
いかがでしたでしょうか。これだけのアーキテクチャを自分で一から考えて実装するのはなかなか大変なことです。
今回のこのBluePrintを是非活かしてSlackから色々なAWSリソースを動かしてみましょう。